// request.js - 网络请求工具
const app = getApp();

// 基础URL
const BASE_URL = 'http://localhost:8000';

/**
 * 发送网络请求
 * @param {string} url - 请求URL
 * @param {object} options - 请求选项
 * @returns {Promise} - 返回Promise对象
 */
function request(url, options = {}) {
  return new Promise((resolve, reject) => {
    // 显示加载提示
    if (options.showLoading !== false) {
      wx.showLoading({
        title: '加载中',
        mask: true
      });
    }

    // 构建请求参数
    const requestParams = {
      url: BASE_URL + url,
      method: options.method || 'GET',
      header: {
        'content-type': 'application/json',
        ...options.header
      },
      data: options.data || {},
      success: (res) => {
        // 隐藏加载提示
        if (options.showLoading !== false) {
          wx.hideLoading();
        }

        // 处理响应数据
        if (res.statusCode === 200) {
          resolve(res.data);
        } else if (res.statusCode === 401) {
          // 未授权，跳转到登录页
          wx.showToast({
            title: '请先登录',
            icon: 'none'
          });
          wx.redirectTo({
            url: '/pages/user/login'
          });
          reject(new Error('未授权'));
        } else {
          // 其他错误
          const errorMsg = res.data?.message || `请求失败(${res.statusCode})`;
          wx.showToast({
            title: errorMsg,
            icon: 'none'
          });
          reject(new Error(errorMsg));
        }
      },
      fail: (err) => {
        // 隐藏加载提示
        if (options.showLoading !== false) {
          wx.hideLoading();
        }

        // 处理请求失败
        console.error('请求失败:', err);
        wx.showToast({
          title: '网络异常，请稍后重试',
          icon: 'none'
        });
        reject(err);
      },
      complete: () => {
        // 确保加载提示被隐藏
        if (options.showLoading !== false) {
          wx.hideLoading();
        }
      }
    };

    // 如果用户已登录，添加token
    if (app.globalData.token) {
      requestParams.header['Authorization'] = `Token ${app.globalData.token}`;
    }

    // 发送请求
    wx.request(requestParams);
  });
}

/**
 * GET请求
 * @param {string} url - 请求URL
 * @param {object} data - 请求参数
 * @param {object} options - 其他选项
 * @returns {Promise} - 返回Promise对象
 */
function get(url, data = {}, options = {}) {
  return request(url, {
    method: 'GET',
    data,
    ...options
  });
}

/**
 * POST请求
 * @param {string} url - 请求URL
 * @param {object} data - 请求参数
 * @param {object} options - 其他选项
 * @returns {Promise} - 返回Promise对象
 */
function post(url, data = {}, options = {}) {
  return request(url, {
    method: 'POST',
    data,
    ...options
  });
}

/**
 * PUT请求
 * @param {string} url - 请求URL
 * @param {object} data - 请求参数
 * @param {object} options - 其他选项
 * @returns {Promise} - 返回Promise对象
 */
function put(url, data = {}, options = {}) {
  return request(url, {
    method: 'PUT',
    data,
    ...options
  });
}

/**
 * DELETE请求
 * @param {string} url - 请求URL
 * @param {object} data - 请求参数
 * @param {object} options - 其他选项
 * @returns {Promise} - 返回Promise对象
 */
function del(url, data = {}, options = {}) {
  return request(url, {
    method: 'DELETE',
    data,
    ...options
  });
}

module.exports = {
  request,
  get,
  post,
  put,
  del
};